package com.xxxx.yoyo.adminweb;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

import com.xxxx.yoyo.bean.Goods;
import com.xxxx.yoyo.bean.Type;
import com.xxxx.yoyo.service.IGoodsService;
import com.xxxx.yoyo.service.ITypeService;
import com.xxxx.yoyo.service.impl.GoodsServiceImpl;
import com.xxxx.yoyo.service.impl.TypeServiceImpl;

/**
 * 管理员添加宠物
 * Servlet implementation class GoodsAddServlet
 */
@MultipartConfig
@WebServlet("/admin/goodsAdd")
public class GoodsAddServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	private ITypeService typeService = new TypeServiceImpl();
	private IGoodsService goodsService = new GoodsServiceImpl();
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 设置导航条上的[宠物管理]处于选中状态
		request.setAttribute("flag", 3);

		// 获取[宠物分类]列表
		List<Type> typeList = typeService.getTypeList();
		// 把typeList存入request中，供/admin/goods add.jsp页面使用
		request.setAttribute("typeList", typeList);

		// 请求转发，跳转到/admin/goods add.jsp页面
		request.getRequestDispatcher("/admin/goods_add.jsp").forward(request, response);

	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 获取前端页面提交的宠物信息
		// !!!如果前端form表单的提交方式是multipart/form-data,
		// 那么无法通过request.getParameter("name")获取数据
		// 必须通过cequest.getPart("name")获取数据
		// 获取宠物名称
		String name = getPartValue(request.getPart("name"));
		if (name.length() > 40) {
			// 提示错误
			request.setAttribute("msg", "添加失败，宠物名字超过了40个字！");

			// 设置导航条上的[宠物管理]处于选中状态
			request.setAttribute("flag", 3);
			// 获取[宠物分类]列表
			List<Type> typeList = typeService.getTypeList();
			// 把typeList存入request中，供/admin/goods add.jsp页面使用
			request.setAttribute("typeList", typeList);
			// 请求转发，跳转到/admin/goods add.jsp页面
			request.getRequestDispatcher("/admin/goods_add.jsp").forward(request, response);
			return;
		}
		// 获取宠物价格
		String pricestr = getPartValue(request.getPart("price"));
		double price = 0;
		try {
			price = Double.parseDouble(pricestr);
		} catch (Exception e) {
			// 提示错误
			request.setAttribute("msg", "添加失败，宠物单价必须是整数或者小数！");

			// 设置导航条上的[宠物管理]处于选中状态
			request.setAttribute("flag", 3);
			// 获取[宠物分类]列表
			List<Type> typeList = typeService.getTypeList();
			// 把typeList存入request中，供/admin/goods add.jsp页面使用
			request.setAttribute("typeList", typeList);
			// 请求转发，跳转到/admin/goods add.jsp页面
			request.getRequestDispatcher("/admin/goods_add.jsp").forward(request, response);
			return;
		}
		// 获取宠物详细介绍
		String intro = getPartValue(request.getPart("intro"));
		if (intro.length() > 255) {
			// 提示错误
			request.setAttribute("msg", "添加失败，宠物详细介绍不能超过255个字！");
			// 设置导航条上的[宠物管理]处于选中状态
			request.setAttribute("flag", 3);
			// 获取[宠物分类]列表
			List<Type> typeList = typeService.getTypeList();
			// 把typeList存入request中，供/admin/goods add.jsp页面使用
			request.setAttribute("typeList", typeList);
			// 请求转发，跳转到/admin/goods add.jsp页面
			request.getRequestDispatcher("/admin/goods_add.jsp").forward(request, response);
			return;
		}
		// 获取宠物库存
		String stockstr = getPartValue(request.getPart("stock"));
		int stock = 0;
		try {
			stock = Integer.parseInt(stockstr);
		} catch (Exception e) {
			// 提示错误
			request.setAttribute("msg", "添加失败，宠物的库存必须是整数！");
			// 设置导航条上的[宠物管理]处于选中状态
			request.setAttribute("flag", 3);
			// 获取[宠物分类]列表
			List<Type> typeList = typeService.getTypeList();
			// 把typeList存入request中，供/admin/goods add.jsp页面使用
			request.setAttribute("typeList", typeList);
			// 请求转发，跳转到/admin/goods add.jsp页面
			request.getRequestDispatcher("/admin/goods_add.jsp").forward(request, response);
			return;
		}
		// 获取宠物种类
		String typeIdstr = getPartValue(request.getPart("typeId"));
		int typeId = Integer.parseInt(typeIdstr);

		// 获取图片cover
		String cover = getImagePath(request.getPart("cover"));
		if (cover == null) {
			// 提示错误
			request.setAttribute("msg", "添加失败，上传图片必须是.jpg或者.png格式文件！");

			// 设置导航条上的[宠物管理]处于选中状态
			request.setAttribute("flag", 3);
			// 获取[宠物分类]列表
			List<Type> typeList = typeService.getTypeList();
			// 把typeList存入request中，供/admin/goods add.jsp页面使用
			request.setAttribute("typeList", typeList);
			// 请求转发，跳转到/admin/goods add.jsp页面
			request.getRequestDispatcher("/admin/goods_add.jsp").forward(request, response);
			return;
		}
		// 获取图片image1
		String image1 = getImagePath(request.getPart("image1"));
		if (image1 == null) {
			// 提示错误
			request.setAttribute("msg", "添加失败，上传图片必须是.jpg或者.png格式文件！");

			// 设置导航条上的[宠物管理]处于选中状态
			request.setAttribute("flag", 3);
			// 获取[宠物分类]列表
			List<Type> typeList = typeService.getTypeList();
			// 把typeList存入request中，供/admin/goods add.jsp页面使用
			request.setAttribute("typeList", typeList);
			// 请求转发，跳转到/admin/goods add.jsp页面
			request.getRequestDispatcher("/admin/goods_add.jsp").forward(request, response);
			return;
		}
		// 获取图片image2
		String image2 = getImagePath(request.getPart("image2"));
		if (image2 == null) {
			// 提示错误
			request.setAttribute("msg", "添加失败，上传图片必须是.jpg或者.png格式文件！");

			// 设置导航条上的[宠物管理]处于选中状态
			request.setAttribute("flag", 3);
			// 获取[宠物分类]列表
			List<Type> typeList = typeService.getTypeList();
			// 把typeList存入request中，供/admin/goods add.jsp页面使用
			request.setAttribute("typeList", typeList);
			// 请求转发，跳转到/admin/goods add.jsp页面
			request.getRequestDispatcher("/admin/goods_add.jsp").forward(request, response);
			return;
		}
		
		//根据用户提交的宠物信息创建宠物对象
		Goods goods = new Goods(name, price, intro, cover, image1, image2, stock, typeId, 1);
		//把宠物添加到数据库中
		goodsService.addGoods (goods);
		//重定向到宠物列表页面
		response.sendRedirect ("/YoyoShop/admin/goodsList?status=0&page=1&size=16");
		
	}

	public String getImagePath(Part part) throws IOException {
		String path = null;
		// 获取上传的文件的原始文件名
		String originFileName = part.getSubmittedFileName();
		if (originFileName.endsWith(".jpg") || originFileName.endsWith(".png")) {
			// 获取文件名中最后一个点（.)的下标
			int lastIndexofDot = originFileName.lastIndexOf(".");
			// 获取文件的后缀
			String suffix = originFileName.substring(lastIndexofDot);
			// 用UUID作为文件名
			UUID uuid = UUID.randomUUID(); // 随机生成字符串
			// 把uuid转换为字符串
			String str = uuid.toString().replace("-", "");// 点后面是把"-"号替换成空字符串
			// 随机字符串和后缀拼成文件名
			String fileName = str + suffix;
			System.out.println(fileName);

			// 上传文件的存储日录(文件夹)
			String picturePath = this.getServletContext().getRealPath("/picture");
			System.out.println(picturePath);
			// 设置图片存储地址
			String savePath = picturePath + "/" + fileName;
			// 开始上传
			part.write(savePath);

			// 数据库要存储的图片地址(名称)
			path = "picture/" + fileName;
		}

		return path;
	}

	// 把Part获取过来的数据转换为字符串形
	public String getPartValue(Part part) throws IOException {
		// multipart/form-data的每一个提交信息都是以二进制(01010101序列)的方式提交的.
		// 所以取的时候，需要获取二进制序列，把它转换为我们真正的内容
		// JDK1.7之后，针对这种需要关闭的内容（流，链接等），提供了try with resources方式，在你用完流之后，会给你安全关闭
		String value = null;
		try (InputStream is = part.getInputStream(); // 把获取的数据转换为二进制字节流
				InputStreamReader isr = new InputStreamReader(is, "UTF-8"); // 把二进制的字符流转换为字符流
				BufferedReader br = new BufferedReader(isr); // 对字符流进行包装，转换为缓冲流
		) {
			// 用完流之后要关闭流
			value = br.readLine(); // 转换为字符串
		}
		return value;
	}

}
